package cn.zhfeat.core.base.interfaces;

import cn.zhfeat.core.base.BaseDto;

import java.io.Serializable;
import java.util.List;


/**
 * @descriptions 底层基本的dao的接口
 * 
 * @param <E> 对应的实体类
 * @param <D> 对应的DTO
 * @param <PK> primary key，即数据库自增ID
 *
 * @author ZhangHao
 * @date 2018年4月26日 上午11:51:27 
 * @version 1.0.0.1
 */
public interface IBaseDao<E , D extends BaseDto, PK extends Serializable> {

	/**
	 * @descriptions 保存单一对象，如果实体中的某个字段为null则不保存这个字段
	 * 	这种保存方法更加灵活。
	 *  
	 * @auto generator会自动生成该方法
	 * @param entity
	 * @date 2016年5月19日下午3:20:23
	 * @author ZhangHao
	 * @version 1.0.0.1
	 */
    public Integer insertSelective(E entity);

    /**
     * @descriptions 保存单一对象，并返回这条记录的生成自增id 
     * 
     * @auto false 该方法对应的sql脚本需要自己写
     * @param entity
     * @date 2016年5月19日下午3:24:06
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer insertGotEntityId(E entity); 
    
    /**
     * @descriptions 保存单一对象，并返回这条记录生成的uuid 
     * 
     * @auto false 该方法对应的sql脚本需要自己写 
     * @param entity
     * @date 2016年5月19日下午3:26:47
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer insertGotEntityUuid(E entity); 
    
    /**
     * @descriptions 批量添加操作，保存一个对象集合
     * 
     * @auto false 该方法对应的sql脚本需要自己写
     * @param list
     * @date 2016年5月19日下午3:28:51
     * @author ZhangHao
     * @version 1.0.0.1 
     */
    public Integer batchInsert(List<E> list);
 
    /**
     * @descriptions 更新对象,如果属性中的主键(id)为空，则不会进行对应的属性值更新。
     * 	如果实体中的某个字段为null则不更新这个字段。这种更新方法更加灵活。
     * 
     * @auto generator会自动生成该方法
     * @param entity
     * @date 2016年5月19日下午3:33:22
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer updateSelective(E entity); 
    
    /**
     * @descriptions 批量更新操作。
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中写批量更新脚本
     * 
     * @param list
     * @date 2016年5月19日下午3:37:07
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer batchUpdate(List<E> list); 

    /**
     * @descriptions 根据id删除对象 
     * 
     * @auto generator会自动生成该方法
     * @param id
     * @date 2016年5月19日下午3:41:49
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer deleteById(PK id); 
    
    /**
     * @descriptions 根据id list 删除对象集合|删除多条记录
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中写批量删除脚本
     * 
     * @param list
     * @date 2016年5月19日下午3:42:23
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer batchDelete(List<PK> list);
    
    /**
     * @descriptions 根据条件集合删除对象
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中写批量删除脚本
     * 
     * @param dto 数据传输对象(Data Transfer Object)   mybatis进行对象匹配的属性
     * @date 2016年5月19日下午3:45:00
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public <DTO> void deleteByCondition(DTO dto);

    /**
     * @descriptions 根据id进行对象查询
     * 
     * @auto generator会自动生成该方法
     * @param id
     * @date 2016年5月19日下午3:56:41
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public E find(PK id); 
    
    /**
	 * @descriptions 根据实体类中的字段条件返回一条记录
	 * 
	 * @auto false 该方法对应的sql脚本需要自己写
	 * @param entity
	 * @date 2016年6月28日下午1:44:04
	 * @author ZhangHao 
	 * @version 1.0.0.1
	 */
    public E findByType(E entity);
    
    /**
     * @descriptions 根据任意属性查询 
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
     * 
     * @param entity 包含查询条件的实体
     * @date 2016年5月19日下午4:00:11
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public List<E> findListByEntity(E entity); 
    
    /**
     * @description: dto作为查询条件
     *
     * @param dto
     * @author ZhangHao
     * @date 2018年5月2日 下午4:37:41 
     * @version 1.0.0.1
     */
    public List<E> findListByDto(D dto);
    
    /**
     * @description: 根据ID查找一条记录
     *
     * @param id
     * @author ZhangHao
     * @date 2018年5月2日 下午4:47:32
     * @version 1.0.0.1
     */
    public E selectByPrimaryKey(PK id);

	/**
	 * @description: 多条件查询并返回实体信息
	 *
	 * @param dto
	 * @author ZhangHao
	 * @date 2018年5月4日 上午10:20:39 
	 * @version 1.0.0.1
	 */
    public E findByType(D dto); 
    
    /**
     * @descriptions 根据数据传输对象中的条件进行查询。此方法常用于分组查询：group by 
     * 	Dto 不同于Entity。
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中重写脚本
     * 
     * @param dto  数据传输对象(Data Transfer Object) 
     * @date 2016年5月19日下午4:10:52
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public <DTO> List<E> findGroupList(DTO dto);  
    
    /**
     * @descriptions 根据条件进行数量的查询
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
     * 
     * @param dto  数据传输对象(Data Transfer Object) 
     * @return 返回符合条件的泛型参数对应表中的数量
     * @date 2016年5月19日下午4:18:57
     * @author ZhangHao
     * @version 1.0.0.1
     * @param <DTO>
     */
    public <DTO> int count(DTO dto); 
    
    /**
     * @descriptions 根据条件集合进行分页查询
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
     * 
     * @param entity
     * @date 2016年5月19日下午4:21:53
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public List<E> queryPage(E entity);  

    /**
     * @description: 根据DTO返回实体视图集合
     *
     * @param dto
     * @author ZhangHao
     * @date 2018年4月27日 上午11:26:44 
     * @version 1.0.0.1
     */
    public List<E> queryPageByDto(D dto);   
    
    /**
     * @descriptions 根据任意属性进行模糊查询
     * 	注意！此方法需要你自己在*****Mapper.xml 文件中重写查询条件
     * 
     * @param entity
     * @date 2016年5月19日下午4:23:24
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public List<E> like(E entity); 
    
    /**
     * @descriptions 查询实体对应表最大Id.该方法只有在主键为int时才有用
     * 	注意！此方法 可能 需要你自己在*****Mapper.xml 文件中重写查询条件
     * 
     * @exception/throws 如果主键类型不为int，会抛出类型转换异常 
     * @return 返回泛型参数对应表的主键最大值
     * @date 2016年5月19日下午4:24:36
     * @author ZhangHao
     * @version 1.0.0.1
     */
    public Integer selectMaxId();

	
    
}








